package educar.gui.student;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

import educar.gui.IView;
import educar.idioma.Locale;
import educar.models.Actividad;
import educar.models.Materia;
import educar.models.Student;
import educar.models.Teacher;
import educar.models.actividadNotFound;
import javax.swing.JList;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ListSelectionModel;


@SuppressWarnings("serial")
public class MateriaPanel implements IView{
	private JPanel contenedor;
	private Materia materia;
	private Student alumno;
	private Actividad actividad;
	/*arreglo que da nombre a las columnas*/
	public String[] columnNames = {};
	/*matriz que contiene los datos de la tabla*/
	public Object[][] data = {};
	/*modelo de la tabla*/
	DefaultTableModel model = new DefaultTableModel(data,columnNames);
	/*tabla no editable*/	
	public JTable table = new JTable(model) {public boolean isCellEditable(int rowIndex, int colIndex) {return false;}};
	
	/**
	 * Constructor de la clase, crea el panel de la materia dada
	 * @param materia "materia a crear"
	 * @param alumno "alumno que cursa la materia"
	 */
	public MateriaPanel(Materia materia, Student alumno){
		this.materia = materia;
		setAlumno(alumno);
		contenedor = new JPanel(new BorderLayout());
		contenedor.add(etiqueta(),BorderLayout.PAGE_START);
		contenedor.add(actividades(),BorderLayout.CENTER);
		//contenedor.add(new JPanel(),BorderLayout.LINE_START);
		JPanel tmp = new JPanel(new BorderLayout());		
		tmp.add(auxiliares(),BorderLayout.CENTER);
		tmp.add(ABMPanel(),BorderLayout.PAGE_END);		
		contenedor.add(tmp,BorderLayout.LINE_END);
	}
	
	
	
	/**
	 * Crea el panel de etiqueta donde estan los datos del docente
	 * responsable y la materia
	 * @return
	 */
	private JPanel etiqueta(){
		JPanel etiqueta = new JPanel(new FlowLayout());
		etiqueta.setBorder(new TitledBorder(null, "Information", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		JLabel cod_materia = new JLabel(Locale.CODE+": "+ materia.getCodigo());
		cod_materia.setFont(new Font("Tahoma", Font.PLAIN, 14));
		JLabel nombre_materia = new JLabel(Locale.NAME+": "+ materia.getNombre());
		nombre_materia.setFont(new Font("Tahoma", Font.PLAIN, 14));
		etiqueta.add(cod_materia);
		etiqueta.add(nombre_materia);
		if (materia.getResponsable() != null ){
			JLabel responsable = new JLabel(Locale.RESPONSIBLE+": "+ materia.getResponsable().getApellido()+", " 
														+ materia.getResponsable().getNombre());
			etiqueta.add(responsable);
			responsable.setFont(new Font("Tahoma", Font.PLAIN, 14));
			
			JLabel email = new JLabel("E-Mail: "+materia.getResponsable().getEmail());
			email.setFont(new Font("Tahoma", Font.PLAIN, 14));
			etiqueta.add(email);			
		}
		return etiqueta;
	}
	
	/**
	 * Panel con el boton de Actividades
	 * @return
	 */
	private JPanel ABMPanel(){		
		/*Creo el Panel de los Botones y lo configuro*/
		JPanel buttonsPane = new JPanel();
		buttonsPane.setLayout(new FlowLayout());
		
		/*Creo otro panel Contenedor con Titulo*/
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(null, "ABM Actividades", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel.setLayout(new FlowLayout());
		/*configuro la orientacion de los componentes*/
		buttonsPane.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		/*
		 * luego agrego el panel al panel principal uno dentro
		 * del otro para que queden centrado en la pantalla 
		 */		
		buttonsPane.add(panel);		
		
		/*Boton agregar usuario*/
		JButton bAdd = new JButton(Locale.SHOW+" "+Locale.ACTIVITY);
		panel.add(bAdd);
		bAdd.addActionListener(new ActionListener () {public void actionPerformed(ActionEvent e){verActividad();}});
		bAdd.setAlignmentX(Component.RIGHT_ALIGNMENT);
		
		/*devuelvo el panel creado*/
		return buttonsPane;
	}

	/**
	 * Crea el panel donde se muestra la tabla de actividades
	 * @return
	 */
	private JScrollPane actividades(){
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		table.setUpdateSelectionOnSort(false);
		table.setBorder(UIManager.getBorder("TextField.border"));
		table.setFillsViewportHeight(true);
		JScrollPane scrollPanel = new JScrollPane(table);
		scrollPanel.setBorder(new TitledBorder(null, "Actividades", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		Refresh();
		return scrollPanel;
	}
	
	
	/**
	 * Crea el panel donde se muestra la tabla de actividades
	 * @return
	 */
	private JScrollPane auxiliares(){
		String[] auxiliares = getAuxiliares();
		JList list = new JList(auxiliares);
		JScrollPane scrollPanel = new JScrollPane(list);
		scrollPanel.setBorder(new TitledBorder(null, "Auxiliares", TitledBorder.LEADING, TitledBorder.TOP, null, null));		
		return scrollPanel;	
	}
	
	/**
	 * Obtiene una lista de los docentes auxiliares
	 * a la materia, con nombre y apellido
	 * @return
	 */
	public String[] getAuxiliares() {		
		Teacher[] tmp = this.getMateria().getMateriaTeacherList();
		String[] auxiliares = new String[tmp.length*3];
		for (int i=0;i<tmp.length*3;i=i+3) {
			try {
				Teacher t = tmp[i/3];
				auxiliares[i] = t.getApellido()+" "+t.getNombre();
				auxiliares[i+1] = t.getEmail();
				auxiliares[i+2] = "--------------";
			} catch (NumberFormatException e) {
				e.printStackTrace();
			}
		}		
		return auxiliares;
	}
	
	/**
	 * Refresco la tabla que se muestra por pantalla
	 */
	public void Refresh() {
		String [] actividad = {"Numero Actividad","Codigo Actividad","Descripcion"};		
		Object[][] actividadTable = Actividad.getActividadTableByMateria(this.getMateria());
		setData(actividadTable);
		setColumnNames(actividad);
		model.setDataVector(data, columnNames);
	}
	
	/**
	 * Funcion que retorna la tabla JTable
	 * Sirve para obtener columna seleccionada o 
	 * seleccionar una columna entre otros
	 * @return JTable "tabla principal"
	 */
	public JTable getTable() {
		return table;
	}
	
	/**
	 * Obtiene el modelo de tabla
	 * sirve entre otros para obtener los datos
	 * y la fila de nombres
	 * @return DefaultTableModel "modelo de tabla"
	 */
	public DefaultTableModel getTableModel(){
		return model;
	}
	
	/**
	 * establece el nombre de las columnas
	 * @param newNames "arreglo con los nombres nuevos"
	 */
	public void setColumnNames (String [] newNames) {
		columnNames = newNames;
	}
	
	
	/**
	 * retorna el nombre de las columnnas
	 * @return String[] "arreglo con el nombre de las columnas"
	 */
	public String[] getColumnNames () {
		return columnNames;
	}
	
	/**
	 * Permite cambiar los datos actuales de la tabla
	 * @param newData "matriz de object (datos)"
	 */
	public void setData (Object [][] newData) {
		data = newData;		
	}
	
	/**
	 * retorna la matriz de datos
	 * @return Object[][] "matriz de datos"
	 */
	public Object[][] getData(){
		return data;
	}
	
	/**
	 * obtiene el contenedor del panel
	 * @return JPanel con todo el panel de la materia
	 */
	public JPanel getContenedor(){
		return contenedor;
	}
	
	/**
	 * Obtiene la actividad de la tabla seleccionada
	 */
	public void getActividadSeleccionada() {
		/*obtengo la fila seleccionada*/
		final int fila = table.getSelectedRow();
		if (fila == -1) {
			JOptionPane.showMessageDialog(null,Locale.FIRST_SELECT_ROW,Locale.NOT_ROW_SELECTED,JOptionPane.WARNING_MESSAGE);
			return;
		}
		else {
			try {
				setActividad(Actividad.getActividadByCodigo((model.getValueAt(fila, 1).toString())));
			} catch (actividadNotFound e) {
				setActividad(null);
			}
		}
	}
	
	
	/**
	 * Abre la ventana para ver una actividad 
	 */
	public void verActividad() {
		getActividadSeleccionada();
		if (this.getActividad()!= null) {
			VerActividad tmp = new VerActividad(this.getMateria(),this.getActividad(),this.getAlumno());
			tmp.setCode(this.getActividad().getCod_actividad());
			tmp.setDescription(this.getActividad().getDescripcion());
			tmp.setFile_path(this.getActividad().getFile_path());
		}
		this.setActividad(null);
		table.clearSelection();
	}

	/**
	 * Set y Get
	 */
	public Actividad getActividad(){
		return this.actividad;
	}

	public void setActividad(Actividad actividad) {
		this.actividad = actividad;
	}

	
	public Student getAlumno() {
		return this.alumno;
	}
	
	public void setAlumno(Student alumno) {
		this.alumno = alumno;
	}
	
	
	public Materia getMateria() {
		return this.materia;
	}
	
	public void setMateria(Materia materia) {
		this.materia=materia;
	}
	

	public void close() {}
	public void present(String model) {}	
}